package chapters15_bingfa.chapters15_3;

/**
 * Created by xinxuchu on 2020/1/29.
 * 各个线程先是分头行动，各自到达一个集合点，在集合点需要集齐所有线程，交换数据，
 * 然后再进行下一步动作。怎么表示这种协作呢？协作的共享变量依然是一个数，
 * 这个数表示未到集合点的线程个数，初始值为子线程个数，每个线程到达集合点后将该值减一，
 * 如果不为0，表示还有别的线程未到，进行等待，如果变为0，表示自己是最后一个到的，
 * 调用notifyAll唤醒所有线程。我们用AssemblePoint类来表示这个协作对象
 */
public class AssemblepPoint {

    private int n;

    public AssemblepPoint(int n) {
        this.n = n;
    }

    public synchronized void await() throws InterruptedException{
        if (n>0){
            n--;
            if (n == 0){
                notifyAll();
            }else {
                while (n!=0){
                    wait();
                }
            }
        }

    }
}
